<?php
class Upcoming {
	protected $apiKey;
	private $token = "7a06d3a66d1a841b3cd0fb68c2bfe0f4e69c0880";
	protected $upcomingURL = 'http://upcoming.yahooapis.com/services/rest/';

// constructor ----------------------------------------------------------------------	
	public function __construct($key) {
		# set api key
		if(!$key) :
			die('No api key');
		endif;
		$this->apiKey = $key;
		
		# create group
		$this->Group = new UpcomingGroup($this->apiKey);
		# create event
		$this->Event = new UpcomingEvent($this->apiKey);
	} // __construct
	

// send a request to upcoming -------------------------------------------------------	
	protected function send($method, $params) {
		$params = array_merge($params, array('api_key' => $this->apiKey, 'method' => $method));
		return $this->__send($this->upcomingURL, $params);
	} // send

	protected function __send($url, $params) {
		# build a query string
		$queryParams = http_build_query($params);
		$url = $url . '?' . $queryParams;
		
		#send curl
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);
		
		return $output;
	} // send

// data formatin functions --------------------------------------------------------------	
	protected function formatEventsData($data) {
		$tmp = array();
		if(isset($data) && (count($data) > 1)) :
			$size = count($data) / 2;
			for($i = 0; $i < $size; $i ++) :
				$event = new UpcomingEvent($this->apiKey);		
				$event->data = $data[$i . '_attr'];
				$tmp[] = $event;
			endfor;
		endif;
		
		return $tmp;
	} // formatEventsData	

// parseXML -------------------------------------------------------------------------
	public function parse($xml) {
		$array = $this->__parse($xml);
		if(isset($array['rsp'])) :
			$array = $array['rsp'];
		endif;
		
		return $array;
	} // parse
	private function __parse($xml)
	{
		$get_attributes = 1;
		$priority = 'tag';
	    if (!function_exists('xml_parser_create'))
	    {
	        return array ();
	    }
	    $parser = xml_parser_create('');

	    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
	    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
	    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
	    xml_parse_into_struct($parser, trim($xml), $xml_values);
	    xml_parser_free($parser);
	    if (!$xml_values)
	        return; //Hmm...
	    $xml_array = array ();
	    $parents = array ();
	    $opened_tags = array ();
	    $arr = array ();
	    $current = & $xml_array;
	    $repeated_tag_index = array ();
	    foreach ($xml_values as $data)
	    {
	        unset ($attributes, $value);
	        extract($data);
	        $result = array ();
	        $attributes_data = array ();
	        if (isset ($value))
	        {
	            if ($priority == 'tag')
	                $result = $value;
	            else
	                $result['value'] = $value;
	        }
	        if (isset ($attributes) and $get_attributes)
	        {
	            foreach ($attributes as $attr => $val)
	            {
	                if ($priority == 'tag')
	                    $attributes_data[$attr] = $val;
	                else
	                    $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
	            }
	        }
	        if ($type == "open")
	        {
	            $parent[$level -1] = & $current;
	            if (!is_array($current) or (!in_array($tag, array_keys($current))))
	            {
	                $current[$tag] = $result;
	                if ($attributes_data)
	                    $current[$tag . '_attr'] = $attributes_data;
	                $repeated_tag_index[$tag . '_' . $level] = 1;
	                $current = & $current[$tag];
	            }
	            else
	            {
	                if (isset ($current[$tag][0]))
	                {
	                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
	                    $repeated_tag_index[$tag . '_' . $level]++;
	                }
	                else
	                {
	                    $current[$tag] = array (
	                        $current[$tag],
	                        $result
	                    );
	                    $repeated_tag_index[$tag . '_' . $level] = 2;
	                    if (isset ($current[$tag . '_attr']))
	                    {
	                        $current[$tag]['0_attr'] = $current[$tag . '_attr'];
	                        unset ($current[$tag . '_attr']);
	                    }
	                }
	                $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
	                $current = & $current[$tag][$last_item_index];
	            }
	        }
	        elseif ($type == "complete")
	        {
	            if (!isset ($current[$tag]))
	            {
	                $current[$tag] = $result;
	                $repeated_tag_index[$tag . '_' . $level] = 1;
	                if ($priority == 'tag' and $attributes_data)
	                    $current[$tag . '_attr'] = $attributes_data;
	            }
	            else
	            {
	                if (isset ($current[$tag][0]) and is_array($current[$tag]))
	                {
	                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
	                    if ($priority == 'tag' and $get_attributes and $attributes_data)
	                    {
	                        $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
	                    }
	                    $repeated_tag_index[$tag . '_' . $level]++;
	                }
	                else
	                {
	                    $current[$tag] = array (
	                        $current[$tag],
	                        $result
	                    );
	                    $repeated_tag_index[$tag . '_' . $level] = 1;
	                    if ($priority == 'tag' and $get_attributes)
	                    {
	                        if (isset ($current[$tag . '_attr']))
	                        {
	                            $current[$tag]['0_attr'] = $current[$tag . '_attr'];
	                            unset ($current[$tag . '_attr']);
	                        }
	                        if ($attributes_data)
	                        {
	                            $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
	                        }
	                    }
	                    $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken
	                }
	            }
	        }
	        elseif ($type == 'close')
	        {
	            $current = & $parent[$level -1];
	        }
	    }
	    return ($xml_array);
	} // __parse

// dump data or the class -----------------------------------------------------------
	static function dump($data = null) {
		echo '<pre>';
		if($data) :
			print_r($data);
		else :
			print_r($this);
		endif;
		echo '</pre>';
	} // dump
} // Upcoming
?>